Drzwi VIP'a V2
Kategoria:Poradniki W tym poradniku (z resztą moim pierwszym) pokaże wam jak zrobić drzwi dla VIP'a, ale w troche inny sposób. Otóż nie będzie on zmieniąć swojego CanCollide (co może spowodować wpuszczenie innych graczy przez te drzwi) tylko sam gracz i drzwi nie będą ze sobą kolizji. Polcane narzędzia: * https://fptje.github.io/glualint-web/ (Linter do roblox lua) * https://www.roblox.com/library/826049158/Collision-Group-Editor (plugin do edytowania grup) * (opcjonalnie) https://www.roblox.com/library/1486925244/Tag-Editor-Beta-Channel (plugin do edytowania tagów) Na początku robimy drzwi: Następnie tworzymy skrypt (najlepiej w ServerScriptService). Zalecam zamiast kopiować go bezmyślnie, przeanalizować go i najlepiej przepisać po swojemu. local PhysicsService = game:GetService("PhysicsService") -- Uzyskujemy service fizyki do zmiennej local GamePassId = 0 -- id gamepassa local VIPS = {"js6pak"} -- osoby ktorym chcemy dać vipa, a np. nie posiadają gamepassa local IsVIP = function(player) if game:GetService("GamePassService"):PlayerHasPass(player, GamePassId) then return true -- Jeżeli posiada gamepass, zwróć "prawda" end for i, VipName in pairs(VIPS) do if player.Name VipName then return true -- jeżeli jego nazwa gracza znajduje się w tabeli o nazwie VIPS, zwróc "prawda" end end return false -- Jeżeli wszystkie powyżej zawiedzie zwróć "fałsz" end -- Funckja pomocna do sprawdzania czy gracz jest Vipem local VipGroup = "VipGroup" -- grupa dla graczy vip local VipDoorGroup = "VipDoorGroup" -- grupa dla drzwi -- dajemy nazwy grup do zmiennych, opcjonalne tylko dla wygody PhysicsService:CreateCollisionGroup(VipGroup) PhysicsService:CreateCollisionGroup(VipDoorGroup) -- tworzymy grupy local VipDoor = game.Workspace.VipHouse.VIPDoor -- lokacja VipDoora PhysicsService:SetPartCollisionGroup(VipDoor, VipDoorGroup) -- dodajemy VipDoora do grupy PhysicsService:CollisionGroupSetCollidable(VipDoorGroup, VipGroup, false) -- Wyłączamy kolizji 2 grup (Vipów i drzwi) local function setCollisionGroupRecursive(object, groupName) if object:IsA("BasePart") then PhysicsService:SetPartCollisionGroup(object, groupName) end for _, child in ipairs(object:GetChildren()) do setCollisionGroupRecursive(child, groupName) end end game.Players.PlayerAdded:Connect(function(player) -- kiedy dołączy gracz wykonaj: player.CharacterAdded:Connect(function(character) -- kiedy character gracza pojawi się wykonaj: if IsVIP(player) then -- jezeli gracz jest vipem wykonaj setCollisionGroupRecursive(character, VipGroup) end end) end) Gotowe! ;) http://i.imgur.com/NWMvXm9l.gifv Limity tego rozwiązania * Każdy place ma limity 32 grup (Łącznie z `defualt`). * `defualt` nie może zostać zabrany * W tym razwiązaniu działają tylko party z CanCollide * Nie można robić grup kolizyjnych w LocalScript (Ponieważ cały PhysicsService jest na serwerze) * Part może mieć tylko jedną grupe kolizyjną naraz (Jak mamy np. VIP i MVIP to trzeba stosować sztucki typu VipMvipGroup) Bonus: CollectionService A co jeżeli mam więcej drzwi? Wystarczy że je otagujemy! Krok 1. Robimy więcej drzwi Krok 2. Tagujemy drzwi manualne, albo tak jak zalecam pluginem (patrz góra) https://i.imgur.com/lJiLODZl.gifv Krok 3. Zmieniamy troche kod: local PhysicsService = game:GetService("PhysicsService") -- Uzyskujemy service fizyki do zmiennej local CollectionService = game:GetService("CollectionService") -- Uzyskujemy service kolekcji do zmiennej local GamePassId = 1 -- id gamepassa local VIPS = {"js6pak"} -- osoby ktorym chcemy dać vipa, a np. nie posiadają gamepassa local IsVIP = function(player) if game:GetService("GamePassService"):PlayerHasPass(player, GamePassId) then return true end -- Jeżeli posiada gamepass, zwróć "prawda" for i, VipName in pairs(VIPS) do if player.Name VipName then return true end -- jeżeli jego nazwa gracza znajduje się w tabeli o nazwie VIPS, zwróc "prawda" end return false -- Jeżeli wszystkie powyżej zawiedzie zwróć "fałsz" end -- Funckja pomocna do sprawdzania czy gracz jest Vipem local VipGroup = "VipGroup" -- grupa dla graczy vip local VipDoorGroup = "VipDoorGroup" -- grupa dla drzwi -- dajemy nazwy grup do zmiennych, opcjonalne tylko dla wygody PhysicsService:CreateCollisionGroup(VipGroup) PhysicsService:CreateCollisionGroup(VipDoorGroup) -- tworzymy grupy PhysicsService:CollisionGroupSetCollidable(VipDoorGroup, VipGroup, false) -- Wyłączamy kolizji 2 grup (Vipów i drzwi) for i, door in pairs(CollectionService:GetTagged("VipDoor")) do PhysicsService:SetPartCollisionGroup(door, VipDoorGroup) -- dodajemy VipDoora do grupy end -- kiedy dołączy gracz wykonaj: game.Players.PlayerAdded:Connect(function(player) -- kiedy character gracza pojawi się wykonaj: player.CharacterAdded:Connect(function(character) wait() -- Wait dodany tylko dlatego, że czasami nie da się nadać collision group dla meshpartów -- jezeli gracz jest vipem wykonaj if IsVIP(player) then -- dla kazdego dziecka i dzieci tego dziecka... wykonaj: for i, child in pairs(character:GetDescendants()) do -- jezeli dziecko jest BasePart wykonaj: if child:IsA("BasePart") then PhysicsService:SetPartCollisionGroup(child, VipGroup) -- dodajemy Vip do grupy end end end end) end) Gotowe! ;)